package com.founder.devwork.persistence.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.founder.devwork.dto.req.CommitLogQueryDTO;
import com.founder.devwork.dto.res.AmountDistributionDTO;
import com.founder.devwork.dto.res.AuthorInfoDTO;
import com.founder.devwork.dto.res.CommitLogDTO;
import com.founder.devwork.dto.res.HourlyStatsDTO;
import com.founder.devwork.dto.res.MonthlyEngineerStatsDTO;
import com.founder.devwork.dto.res.MonthlyRepoStatsDTO;
import com.founder.devwork.dto.res.TopCommitterDTO;
import com.founder.devwork.dto.res.TopRepositoryDTO;
import com.founder.devwork.dto.res.WeeklyStatsDTO;
import com.founder.devwork.entity.CommitLog;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 提交日志数据访问层接口
 * 负责CommitLog实体的数据库操作，包括各种统计查询功能
 */
@Mapper
public interface CommitLogMapper extends BaseMapper<CommitLog> {
    /**
     * 查询提交次数最多的开发者
     *
     * @param limit 查询结果数量限制
     * @param sortBy 排序字段
     * @param sortDirection 排序方向（ASC/DESC）
     * @return TopCommitterDTO列表，包含开发者信息和提交统计
     */
    List<TopCommitterDTO> selectTopByCommitCount(@Param("limit") Integer limit, @Param("sortBy") String sortBy, @Param("sortDirection") String sortDirection);

    /**
     * 查询上个月提交次数最多的开发者
     *
     * @param limit 查询结果数量限制
     * @param sortBy 排序字段
     * @param sortDirection 排序方向（ASC/DESC）
     * @return TopCommitterDTO列表，包含上个月活跃开发者信息
     */
    List<TopCommitterDTO> selectTopLastMonthByCommitCount(@Param("limit") int limit, @Param("sortBy") String sortBy, @Param("sortDirection") String sortDirection);

    /**
     * 查询所有开发者上个月的提交统计
     *
     * @param sortBy 排序字段
     * @param sortDirection 排序方向（ASC/DESC）
     * @return TopCommitterDTO列表，包含所有开发者上个月提交统计
     */
    List<TopCommitterDTO> selectAllLastMonthByCommitCount(@Param("sortBy") String sortBy, @Param("sortDirection") String sortDirection);

    /**
     * 查询上个月变更最多的代码仓库
     *
     * @param limit 查询结果数量限制
     * @return TopRepositoryDTO列表，包含仓库变更统计信息
     */
    List<TopRepositoryDTO> selectTopLastMonthRepositoriesByChanges(int limit);

    /**
     * 查询所有开发者的提交统计
     *
     * @param sortBy 排序字段
     * @param sortDirection 排序方向（ASC/DESC）
     * @return TopCommitterDTO列表，包含所有开发者提交统计
     */
    List<TopCommitterDTO> selectAllByCommitCount(@Param("sortBy") String sortBy, @Param("sortDirection") String sortDirection);

    /**
     * 查询指定仓库过去12个月的每月统计
     *
     * @param gitInstance Git实例标识
     * @param repositoryId 仓库ID
     * @return MonthlyRepoStatsDTO列表，包含每月统计信息
     */
    List<MonthlyRepoStatsDTO> selectMonthlyStatsForRepo(@Param("gitInstance") String gitInstance, @Param("repositoryId") String repositoryId);

    /**
     * 查询指定工程师过去12个月的每月统计
     *
     * @param engineerId 工程师ID
     * @return MonthlyEngineerStatsDTO列表，包含每月统计信息
     */
    List<MonthlyEngineerStatsDTO> selectMonthlyStatsForEngineer(@Param("engineerId") String engineerId);

    /**
     * 查询每小时提交统计
     *
     * @return HourlyStatsDTO列表，包含每小时统计信息
     */
    List<HourlyStatsDTO> selectHourlyStats(@Param("engineerId") String engineerId);

    /**
     * 查询每周提交统计
     *
     * @return WeeklyStatsDTO列表，包含每周统计信息
     */
    List<WeeklyStatsDTO> selectWeeklyStats(@Param("engineerId") String engineerId);

    /**
     * 查询提交变更量的分布（分桶）
     *
     * @return AmountDistributionDTO列表，包含分布信息
     */
    List<AmountDistributionDTO> selectCommitAmountDistribution();

    /**
     * 查询工程师每日变更量总和的分布（分桶）
     *
     * @return AmountDistributionDTO列表，包含分布信息
     */
    List<AmountDistributionDTO> selectDailyEngineerAmountDistribution();

    /**
     * 查询提交变更量的平均值和中位数
     *
     * @return Map包含平均值和中位数
     */
    Map<String, Double> selectCommitAmountStats();

    /**
     * 查询工程师每日变更量的平均值和中位数
     *
     * @return Map包含平均值和中位数
     */
    Map<String, Double> selectDailyEngineerAmountStats();

    /**
     * 查询有效提交总数
     *
     * @return 提交总数
     */
    long selectCommitCount();

    /**
     * 查询提交变更量的平均值
     *
     * @return 平均变更量
     */
    double selectCommitAverage();

    /**
     * 查询用于计算提交变更量中位数的值
     *
     * @param offset 偏移量
     * @return 变更量列表
     */
    List<Integer> selectCommitMedianValues(@Param("offset") int offset);

    /**
     * 查询工程师每日提交记录总数
     *
     * @return 每日记录总数
     */
    long selectDailyEngineerCount();

    /**
     * 查询工程师每日变更量的平均值
     *
     * @return 平均每日变更量
     */
    double selectDailyEngineerAverage();

    /**
     * 查询用于计算工程师每日变更量中位数的值
     *
     * @param offset 偏移量
     * @return 变更量列表
     */
    List<Integer> selectDailyEngineerMedianValues(@Param("offset") int offset);

    /**
     * 查询符合条件的提交日志总数
     *
     * @param query 查询条件
     * @return 符合条件的提交日志总数
     */
    long countCommitLogsWithQuery(@Param("query") CommitLogQueryDTO query);

    /**
     * 查询符合条件的提交日志
     *
     * @param query 查询条件
     * @param offset 偏移量
     * @param pageSize 每页条数
     * @return 符合条件的提交日志列表
     */
    List<CommitLogDTO> selectCommitLogsWithQuery(@Param("query") CommitLogQueryDTO query, @Param("offset") int offset, @Param("pageSize") int pageSize);

    List<AuthorInfoDTO> selectDistinctAuthors();
}
